package com.zrc.japktool.util;

import java.awt.Desktop;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.List;

public class FileUtil {

//    private void selectOutputDir() {
//        DirectoryChooser dirChooser = new DirectoryChooser();
//        dirChooser.setTitle("选择输出目录");
//
//        // 设置初始目录为桌面（兼容 Windows/macOS/Linux）
//        File desktopDir = new File(System.getProperty("user.home"), "Desktop");
//        if (desktopDir.exists()) {
//            dirChooser.setInitialDirectory(desktopDir);
//        } else {
//            // 如果 Desktop 目录不存在（如某些 Linux 环境），则回退到用户主目录
//            dirChooser.setInitialDirectory(new File(System.getProperty("user.home")));
//        }
//
//        File dir = dirChooser.showDialog(null);
//        if (dir != null) {
//            outputDir_TextField.setText(dir.getAbsolutePath());
//            log("输出目录: " + dir.getAbsolutePath());
//        }
//
//    }

    //打开指定文件并定位位置
    public static void openFileLocation(String filePath) {
        try {
            File file = new File(filePath);
            
            // 检查文件是否存在
            if (!file.exists()) {
                //showAlert("文件不存在", "指定的文件不存在: " + filePath);
                return;
            }
            
            // 获取桌面环境
            if (Desktop.isDesktopSupported()) {
                Desktop desktop = Desktop.getDesktop();
                
                // 检查是否支持browseFileDirectory操作
                try {
                    // Java 9+ 推荐方式
                    desktop.browseFileDirectory(file);
                } catch (UnsupportedOperationException e) {
                    // 回退到旧方法（适用于Java 8）
                    if (file.isDirectory()) {
                        desktop.open(file);
                    } else {
                        desktop.open(file.getParentFile());
                    }
                }
            } else {
                //showAlert("不支持的操作", "当前平台不支持打开文件位置功能");
            }
        } catch (IOException e) {
            //showAlert("错误", "无法打开文件位置: " + e.getMessage());
            e.printStackTrace();
        }
    }

    //注意resFilePath必须已/开头 如:"windows/adb.exe"
    public static void copyResourceFile2WorkDir(String resFilePath){
        try{
            String fileName = new File(resFilePath).getName();
            String workingDir = System.getProperty("user.dir");
            Path destination = Paths.get(workingDir, fileName);
            InputStream is = FileUtil.class.getResourceAsStream("/" +resFilePath);// 从 resources 获取输入流
            if (is == null) {
                throw new IOException("找不到资源文件: " + resFilePath);
            }
            Files.copy(is, destination, StandardCopyOption.REPLACE_EXISTING); // 复制文件到目标位置
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void copyResourceFile2WorkDir(String... resPaths) throws IOException {
        String workingDir = System.getProperty("user.dir");
        List<String> paths = Arrays.asList(resPaths);
        for (String path : paths) {
            try (InputStream depStream = FileUtil.class.getModule().getResourceAsStream("/" + path)) {
                File depFile = new File(workingDir, new File(path).getName());
                Files.copy(depStream, depFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }

    //注意resFilePath必须已/开头 如:"/windows/adb.exe"
    public static boolean isExistInResource(String resFilePath){
        try(InputStream is = FileUtil.class.getResourceAsStream(resFilePath)){// 从 resources 获取输入流
            return is != null;
        }catch (Exception e){
            return false;
        }
    }

    public static boolean isExistInWorkDir(String fileName){
        Path filePath = Paths.get(System.getProperty("user.dir"), fileName);
        return filePath.toFile().exists();
    }

    public static boolean isExistInWorkDir(String... fileNames) {
        for (String fileName : fileNames) {
            Path filePath = Paths.get(System.getProperty("user.dir"), fileName);
            if (!Files.exists(filePath)) {
                return false;
            }
        }
        return true;
    }

//    /**
//     * 递归删除指定目录及其所有内容
//     * @param inFilePath 资源文件路径全路径
//     * @param outFilePath 要拷贝目标文件全路径
//     */
//    public static void copyFile(String inFilePath, String outFilePath) throws Exception{
//        try (InputStream in = Files.newInputStream(Paths.get(inFilePath)); OutputStream out = Files.newOutputStream(Paths.get(outFilePath))) {
//            byte[] buffer = new byte[4096];
//            int len;
//            while ((len = in.read(buffer)) != -1) {
//                out.write(buffer, 0, len);
//            }
//            out.flush();// 强制刷新输出流，确保数据写入完成
//        }
//    }

    /**
     * 递归删除指定目录及其所有内容
     * @param inFilePath 资源文件路径全路径
     * @param outFilePath 要拷贝目标文件全路径
     */
    public static void copyFile(String inFilePath, String outFilePath) throws Exception {
        byte[] fileContent = Files.readAllBytes(Paths.get(inFilePath));
        Files.write(Paths.get(outFilePath), fileContent);
    }


    /**
     * 递归删除指定目录及其所有内容
     * @param directory 要删除的目录
     * @return 如果删除成功返回true，否则返回false
     */
    public static boolean delDir(File directory) {
        if (!directory.exists()) return false; // 检查目录是否存在
        if (!directory.isDirectory()) return false; // 检查是否是目录
        File[] files = directory.listFiles(); // 获取目录下的所有文件和子目录
        if (files != null) {
            for (File file : files) {// 递归删除所有子文件和子目录
                if (file.isDirectory()) {
                    if (!delDir(file)) return false;// 递归删除子目录
                } else {
                    if (!file.delete()) return false;// 删除文件
                }
            }
        }
        return directory.delete(); // 最后删除空目录
    }

    /**
     * 从resources指定路径获取文件的byte[]
     *
     * @param resourcePath resources下的文件路径，例如："images/logo.png" 或 "data/config.json"
     * @return 文件内容的字节数组
     * @throws IOException 如果文件不存在或读取失败时抛出
     */
    public static byte[] getResourceAsBytes(String resourcePath) throws IOException {
        try (InputStream inputStream = FileUtil.class.getModule().getResourceAsStream("/"+resourcePath)) {
            return inputStream.readAllBytes();
        }
    }
    public static boolean deleteFileWithRetry(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            return true; // 文件不存在，认为删除成功
        }

        // 首先尝试直接删除
        if (file.delete()) {
            return true;
        }

        // 如果直接删除失败，尝试强制解除文件占用
        try {
            // 在Windows系统上，强制解除文件句柄占用
            System.gc(); // 建议JVM进行垃圾回收，释放可能占用的文件句柄
        } catch (Exception e) {
            // 忽略垃圾回收异常
        }

        // 等待一段时间后重试删除
        try {
            Thread.sleep(100); // 等待100毫秒
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // 重试删除
        if (file.delete()) {
            return true;
        }
        return false;
    }
}